// main.cpp
#include "pers.h"
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include "tab_dynamique.h"
#include "table_hashage.h"
#include "skiplist.h"
#include <ctime>


int main()
{
	FILE* fichier_temps_insert, *fichier_temps_localisation;
	const int TAILLE_MAX = 1000000;
	Pers* pop = new Pers[TAILLE_MAX];
	int i, taille_pop;
	clock_t start, finish;
	double temps;
	int n,m;
	SCell *cellule;

	srand(12);

	// Creation d'un stock de Pers
	for(i=0;i<TAILLE_MAX;++i)
		persInit(pop[i]);
	#if 0
	for(i=0;i<TAILLE_MAX;++i)
		persAff(pop[i]);
	#endif


	// ************** TAB DYN NON TRIE *******************************************
	/*TableauDynamique population;

	fichier_temps_insert = fopen("temps_TABDYN_insertion.txt", "w");
	assert( fichier_temps_insert);
	fichier_temps_localisation = fopen("temps_TABDYN_recherche.txt", "w");
	assert( fichier_temps_localisation);
	fprintf(fichier_temps_insert, "# \"nb\" \"temps\"\n");
	fprintf(fichier_temps_localisation, "# \"nb\" \"temps\"\n");

	for(taille_pop=2;taille_pop<TAILLE_MAX;taille_pop+=taille_pop)
	{
		initialisationTabDyn(population);

		start = clock();
		for(i=0;i<taille_pop;++i)
			ajouteElementTableauDynamique(population, pop[i]);
		finish = clock();
		temps = (float(finish)-start)/CLOCKS_PER_SEC;
		fprintf( fichier_temps_insert, "%d %f\n", taille_pop, temps);
		printf( "insertion : taille_pop=%d  temps=%f\n", taille_pop, temps);

		start = clock();
		for(i=0;i<taille_pop;++i)
		{
			n = rand()%taille_pop;
			m = rechercheElementTableauDynamique(population, pop[n], persComp);
			assert(n==m);
		}
		finish = clock();
		temps = (float(finish)-start)/CLOCKS_PER_SEC;
		fprintf( fichier_temps_localisation, "%d %f\n", taille_pop, temps);
		printf( "recherche : taille_pop=%d  temps=%f\n", taille_pop, temps);

		testamentTabDyn(population);
	}
	fclose(fichier_temps_insert);
	fclose(fichier_temps_localisation);*/
	// *******************************************************************************

	// ************** SKIPLIST TRIE *******************************************

	SListe population;

	fichier_temps_insert = fopen("temps_SKIPLIST_insertion.txt", "w");
	assert( fichier_temps_insert);
	fichier_temps_localisation = fopen("temps_SKIPLIST_recherche.txt", "w");
	assert( fichier_temps_localisation);
	fprintf(fichier_temps_insert, "# \"nb\" \"temps\"\n");
	fprintf(fichier_temps_localisation, "# \"nb\" \"temps\"\n");

	for(taille_pop=2;taille_pop<TAILLE_MAX;taille_pop+=taille_pop)
	{
		initialisationSListe(population);

		start = clock();
		for(i=0;i<taille_pop;++i)
			ajoutSListe(population, pop[i]);
		finish = clock();
		temps = (float(finish)-start)/CLOCKS_PER_SEC;
		fprintf( fichier_temps_insert, "%d %f\n", taille_pop, temps);
		printf( "insertion : taille_pop=%d  temps=%f\n", taille_pop, temps);

		start = clock();
		for(i=0;i<taille_pop;++i)
		{
			n = rand()%taille_pop;
			cellule = rechercheSListe(population, pop[n], 0);
			assert(n==cellule->celluleSuivante[0]->personne.cle);
		}
		finish = clock();
		temps = (float(finish)-start)/CLOCKS_PER_SEC;
		fprintf( fichier_temps_localisation, "%d %f\n", taille_pop, temps);
		printf( "recherche : taille_pop=%d  temps=%f\n", taille_pop, temps);
	}
	fclose(fichier_temps_insert);
	fclose(fichier_temps_localisation);
	// *******************************************************************************


	// ************** TABLE HASH *******************************************
	TableHashage populationHash;

	fichier_temps_insert = fopen("temps_TABLEHASHAGE_insertion.txt", "w");
	assert( fichier_temps_insert);
	fichier_temps_localisation = fopen("temps_TABLEHASHAGE_recherche.txt", "w");
	assert( fichier_temps_localisation);
	fprintf(fichier_temps_insert, "# \"nb\" \"temps\"\n");
	fprintf(fichier_temps_localisation, "# \"nb\" \"temps\"\n");

	for(taille_pop=2;taille_pop<TAILLE_MAX;taille_pop+=taille_pop)
	{
		initTabHash(populationHash, TAILLE_MAX);

		start = clock();

		for(i=0;i<taille_pop;++i)
		{
		    ajouterTabHash(pop[i], populationHash, hashPersonne, reHashPersonne);
		}

		finish = clock();
		temps = (float(finish)-start)/CLOCKS_PER_SEC;

		fprintf( fichier_temps_insert, "%d %f\n", taille_pop, temps);

		printf( "insertion : taille_pop=%d  temps=%f\n", taille_pop, temps);

		start = clock();
		for(i=0;i<taille_pop;++i)
		{
		    n = rand()%taille_pop;
			m = recherchePersonneTabHash(populationHash, pop[n], persComp);
			if(m == -1)
			{
			    printf("erreur\n");
			}
		}
		finish = clock();
		temps = (float(finish)-start)/CLOCKS_PER_SEC;
		fprintf( fichier_temps_localisation, "%d %f\n", taille_pop, temps);
		printf( "recherche : taille_pop=%d  temps=%f\n", taille_pop, temps);

		testamentTabHash(populationHash);
	}
	fclose(fichier_temps_insert);
	fclose(fichier_temps_localisation);
	// *******************************************************************************



	delete pop;
	return 0;
}
